package br.com.relatorio.bean;

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.RelatorioUtil;
import br.com.frequencia.crossTab.CrossTab;
import br.com.frequencia.crossTab.Header;
import br.com.relatorio.dto.AlunoDTO;
import br.com.relatorio.dto.CredenciamentoDTO;
import br.com.relatorio.dto.EtiquetaDTO;
import br.com.relatorio.dto.MapaFrequencia;
import br.com.relatorio.util.Constantes;

@ManagedBean
@SessionScoped
public class RelatorioBean implements Serializable {

	private static final long serialVersionUID = 1L;

	public void relatorioCredenciamento() {
		try {

			String caminho = "/jasper/credenciamento.jasper";

			Map<String, Object> map = new HashMap<String, Object>();

			map.put("image",
					FacesContext
							.getCurrentInstance()
							.getExternalContext()
							.getRealPath(
									"/resources/design/imagem/relatorio/logo.png"));

			map.put("SUBREPORT_DIR", FacesContext.getCurrentInstance()
					.getExternalContext().getRealPath("/jasper/")
					+ File.separator);
			map.put("tituloDescricaoSemana",
					"1ª Semana de Administração Orçamentária, Financeira e de Contratações Públicas");
			map.put("tituloDataLocal", "Brasília-DF de 01 a 05/04 de 2013");
			map.put("lista", populaCredenciamento());

			RelatorioUtil.gerarRelatorio(map, caminho, "Credenciamento",
					Constantes.EXCEL);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	public void etiqueta() {
		try {

			String caminho = "/jasper/etiqueta.jasper";

			RelatorioUtil.gerarRelatorio(populaEtiqueta(), caminho,
					"Etiqueta", Constantes.EXCEL,true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	public void relatorioMapa() {
		try {

			// Carrega lista de frequencia.
			List<AlunoDTO> listaFrequencia = populaMapa();

			// calcular Total Faltas
			calcularTotalFaltas(listaFrequencia);

			// Monta crossTable
			List<CrossTab> listaCross = montarCrossTab(listaFrequencia);

			String caminho = "/jasper/mapaGeral.jasper";
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("image",
					FacesContext
							.getCurrentInstance()
							.getExternalContext()
							.getRealPath(
									"/resources/design/imagem/relatorio/logo.png"));

			map.put("SUBREPORT_DIR", FacesContext.getCurrentInstance()
					.getExternalContext().getRealPath("/jasper/")
					+ File.separator);
			map.put("tituloDescricaoSemana",
					"1ª Semana de Administração Orçamentária, Financeira e de Contratações Públicas");
			map.put("tituloDataLocal", "Brasília-DF de 01 a 05/04 de 2013");

			RelatorioUtil.gerarRelatorio(listaCross, map, caminho,
					"MapaGeralFrequencia", Constantes.EXCEL);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	private List<CredenciamentoDTO> populaCredenciamento() {
		List<CredenciamentoDTO> credenciamentoDTOs = new LinkedList<CredenciamentoDTO>();

		Integer cont = 1;
		while (cont != 100) {
			CredenciamentoDTO dto = new CredenciamentoDTO();
			dto.setOrdem(cont.toString());
			dto.setNomeCompleto("Dom Pedro" + cont);
			dto.setOrgao("CNPq" + cont);
			dto.setInscricao("1234567" + cont);
			cont++;
			credenciamentoDTOs.add(dto);
		}

		return credenciamentoDTOs;

	}

	private List<EtiquetaDTO> populaEtiqueta() {
		List<EtiquetaDTO> etiquetas = new LinkedList<EtiquetaDTO>();

		Integer cont = 1;
		while (cont != 1000) {
			EtiquetaDTO dto = new EtiquetaDTO();
			dto.setNomeCompleto("Dom Pedro" + cont);
			dto.setInscricao("1234567" + cont);
			cont++;
			etiquetas.add(dto);
		}

		return etiquetas;
	}

	private List<AlunoDTO> populaMapa() {
		List<AlunoDTO> lista = new ArrayList<AlunoDTO>();

		Integer cont2 = 1;
		while (cont2 != 100) {
			AlunoDTO dto = new AlunoDTO();
			dto.setNomeCompleto("Dom Pedro" + cont2);
			dto.setOrgao("CNPq" + cont2);
			dto.setInscricao("1234567" + cont2);

			Integer cont = 1;
			while (cont != 5) {
				MapaFrequencia frequencia = new MapaFrequencia();
				frequencia.setData("0" + cont + "/01/2013 Manhã");
				if (cont % 2 == 0) {
					frequencia.setPresenca("P");
				} else {
					frequencia.setPresenca("F");
				}
				dto.getMapaFrequencia().add(frequencia);

				frequencia = new MapaFrequencia();
				frequencia.setData("0" + cont + "/01/2013 Tarde");
				if (cont % 2 == 0) {
					frequencia.setPresenca("P");
				} else {
					frequencia.setPresenca("F");
				}
				dto.getMapaFrequencia().add(frequencia);
				cont++;
			}
			lista.add(dto);
			cont2++;
		}

		return lista;
	}

	public List<CrossTab> montarCrossTab(List<AlunoDTO> lista) {
		List<CrossTab> listaRetorno = new ArrayList<CrossTab>();
		Integer cont = 1;
		for (AlunoDTO list : lista) {
			Integer posicao = 1;
			// Atributos do aluno
			listaRetorno.add(new CrossTab(new Header("Nome", posicao++), cont,
					list.getNomeCompleto()));
			listaRetorno.add(new CrossTab(new Header("Inscrição", posicao++),
					cont, list.getInscricao()));
			listaRetorno.add(new CrossTab(new Header("Órgão", posicao++), cont,
					list.getOrgao()));
			for (MapaFrequencia frequencia : list.getMapaFrequencia()) {
				// atributos da frequencia
				listaRetorno.add(new CrossTab(new Header(frequencia.getData(),
						posicao++), cont, frequencia.getPresenca()));
			}
			listaRetorno.add(new CrossTab(
					new Header("Total Faltas", posicao++), cont, list
							.getTotalFaltas()));
			cont++;
		}

		return listaRetorno;

	}

	private void calcularTotalFaltas(List<AlunoDTO> listaFrequencia) {
		for (AlunoDTO alunoDTO : listaFrequencia) {

			Integer totalFaltas = 0;
			for (MapaFrequencia frequencia : alunoDTO.getMapaFrequencia()) {
				if (frequencia.getPresenca() == null
						|| frequencia.getPresenca().isEmpty()) {
					continue;
				}

				if (frequencia.getPresenca().equalsIgnoreCase("F")) {
					totalFaltas++;
				}

				alunoDTO.setTotalFaltas(totalFaltas.toString());
			}

		}

	}
}
